<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <script>
        // 这节课我们来看一看Set类型数据的遍历相关方法
        let s = new Set([11, 22, 33, 44, 55, 66, 77, 88]);

        // set类型数据是可以进行forEach遍历的，用法和数组一样
        s.forEach((item, index, set) => {
            console.log(item, index, set); //你会发现item和index好像一样，下面会告诉你原因的
        })

        // keys() 返回键名的遍历器，其实set结构不像数组会有索引，Set数据的键名其实就是键值
        for (let key of s.keys()) {
            console.log(key);
        }

        // values() 返回键值的遍历器
        for (let value of s.values()) {
            console.log(value);
        }

        // entries() 返回键值对的遍历器，不过我们上面说了set数据的键名和键值是一样的
        for (let [key, value] of s.entries()) {
            console.log(key, value);
        }

        // size属性会返回Set数据的长度，就像数组的length属性
        console.log(s.size);

        console.log('----------------------------------------');

        // 也许你要问了，既然键名和键值一样，那为啥还要有entries()这个东西啊
        // 这玩意在set里是个废物，但是在数组里却是块宝
        let arr = [1, 2, 3, 4, 5, 6];
        for (let [index, value] of arr.entries()) {
            console.log(index, value); //这样就拿到了索引和对应的值
        }
        // keys和values也是同理
        for (let index of arr.keys()) {
            console.log(index);
        }
        for (let value of arr.values()) {
            console.log(value);
        }

        console.log('----------------------------------------');

        // 不知道你有没有这种疑问，set可以去重，那这个去重会对引用类型数据生效吗？答案是否定的
        let s2 = new Set([{
                name: 'hzj'
            },
            {
                name: 'hzj'
            }
        ]);
        console.log(s2); //你会发现并没有去重

        // 但是我们可以根据Set的特性结合数组的filter方法，以及JSON.stringfy()实现数组中引用类型的去重，偷偷告诉你，这也许是你未来的面试题哦
        let arr2 = [1,2,'mikaisa',{name:'hzj'},{name:'hzj'}];

        function qc(arr){
            let set = new Set();
            return arr.filter((item)=>{
                let id = JSON.stringify(item);
                if(set.has(id)){
                    return false;
                }
                else{
                    set.add(id)
                    return true;
                }
            })
        }

        arr2 = qc(arr2);
        console.log(arr2);
    </script>
</body>

</html>